package net.lzzy.practicesapi1.repositeries;

import net.lzzy.practicesapi1.entities.User;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;
import java.util.UUID;

/**
 * @author 梁园钲
 */
public interface UserRepository extends JpaRepository<User, UUID>{
    /**
     * @param username 要检查的用户名
     * @param password 要检查的密码
     * @return 用户对象
     */
    User findUserByUsernameAndPassword(String username, String password);

    /**
     * 检查数据库中是否存在该用户
     * @param username 要检查的用户名
     * @return 存在的数量
     */
    Integer countByUsername(String username);

//    List<UserProjection> findUserByUserName(String userName);

    /**
     * 登录时根据用户名查找其注册时保存的salt
     * @param username 要查找的用户名
     * @return 返回用户的salt
     */
    UserProjection findUserByUsername(String username);


    /**
     * 获取所有用户
     * @return 用户列表
     */
    List<User> findAllByOrderByUpdateTimeDesc();

    /**
     * 分页获取用户数据
     * @param pageable 分页参数，包括页码和每页大小
     * @return 按分页大小返回User表记录
     */

    List<User> findAllByOrderByUpdateTimeDesc(Pageable pageable);

    /** 返回User表所有数据记录
     * @return 用户记录数
     */
    Integer countAllBy();

    /**
     * 获取申请教师资格的所有用户记录
     * @param apply 是否申请教师
     * @return 申请/未申请教师的用户记录
     */
    List<User> findUsersByApplyTeacherOrderByUpdateTimeDesc(boolean apply);

    /**
     * 1.使用Query注解可进行自定义查询，而不用局限与方法名约定
     * 2.使用方法：1.添加注解 2.使用命名参数如：kw表示方法参数 3。使用类似sql的jpql规则，但是字段名非列名
     * 3.参数绑定：kw是占位符，需要在方法参数中使用@param注解将方法参数与占位符绑定
     * @param keyword 要查询的关键词
     * @return 模糊查询的结果集
     */
    @Query("select u from User u where u.username like concat('%',:kw,'%') or" +
            " u.nickName like  concat('%',:kw,'%') or u.email like  concat('%',:kw,'%') or" +
            " u.phone like  concat('%',:kw,'%') order by u.updateTime desc ")
    List<User> findByQuery(@Param("kw") String keyword);

}
